#define _REENTRANT
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>

void* thread_function(void* arg);

int main(void)
{
	int res;
	pthread_t a_thread;
	void* thread_result;
	
	res = pthread_create(&a_thread, NULL, thread_function, NULL);
	if (0 != res)
	{
		perror("Thread creation failed");
		exit(EXIT_FAILURE);
	}
	
	sleep(3);
	printf("Cacneling thread...\n");
	res = pthread_cancel(a_thread);
	if (0 != res)
	{
		perror("Thread cancelation failed");
		exit(EXIT_FAILURE);
	}
	
	printf("Waiting for thread to finish...\n");
	res = pthread_join(a_thread, &thread_result);
	if (0 != res)
	{
		perror("Thread join failed");
		exit(EXIT_FAILURE);
	}
	
	return 0;
}

void* thread_function(void* arg)
{
	int i, res;

	res = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
	if (0 != res)
	{
		perror("Thread pthread_setcancelstate failed");
		exit(EXIT_FAILURE);
	}
	
	res = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
	if (0 != res)
	{
		perror("Thread pthread_setcanceltype failed");
		exit(EXIT_FAILURE);
	}
	
	printf("thread_function is running\n");
	for (i = 0; i < 10; i++)
	{
		printf("Thread is still running (%d)...\n", i);
		sleep(1);
	}
	
	pthread_exit(0);
}